package com.atguigu.bigdata.scala.chapter10

object Scala01_Transform {

    def main(args: Array[String]): Unit = {

        // byte(8) => int(32)



        // TODO 1. 从语法逻辑上来理解，下面的代码其实会发生错误,但是可以执行
        // scala中Byte, Int是对象类型，不是基本数据类型，所以不存在精度的概念
        // 如果两个类型之间能够进行转换而不发生错误，那么必须两个类型之间有关系
        // 继承，实现（混入）

        // 下面的代码其实是由编译器进行隐式转换
        val b : Byte = 10 // 8
        val i : Int = b   // 32
        println(i)

        // TODO 2. 从语法逻辑上来理解，下面的代码其实会发生错误,但是可以执行
        // 字符串是不能够之间当成数组来使用,所以不能使用索引访问
        // 伴生对象中可以声明apply方法，通过伴生对象直接调用。
        // 伴生类中也可以声明apply方法，通过对象调用
        // apply方法一般用于构建当前类的对象，但不是固定的。只是常规用法。
        User.apply()
        User()
        val user = new User();
        user.apply("zhangsan")
        user("zhangsan")

        // scala中没有字符串类，字符串来自于java，java的字符串没有apply方法
        // 编译器在编译的过程中，将字符串转换成了StringOps类，所以就有了apply方法
        // 这个转换的过程，看不见，由编译器自动完成，称之为隐式转换。
        val s = "abc"
        println( s.apply(0) )
        println( s(0) )

    }
    class User {
        def apply(name:String)  = {
            println("xxxxxx")
        }
    }
    object User {
        def apply(): User = new User()
    }
}
